#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <fcntl.h>
 
void my_daemon(int nochdir, int noclose)
{
    umask(0);
    if(fork()>0){
        //father
        exit(0);
    }
    signal(SIGCHLD, SIG_IGN);
    setsid();
 
    //不是必须的,防御性的编程
    if(fork() > 0){
        //father
        exit(0);
    }
 
    if(nochdir == 0){
        chdir("/"); //可选的选项
    }
    //孙子进程
    //可选的选项
    if(noclose == 0){
        close(0);
        //close(1);
        //close(2);
        int fd = open("/dev/null", O_RDWR);
        if(fd < 0){
            return; //??
        }
        dup2(fd, 1);
        dup2(fd, 2);
    }
}
 
int main()
{
    my_daemon(0, 0);
 
    while(1){
        //todo 某种周期性任务
        sleep(1);
    }
}
